package com.baizhi.util;

import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.Properties;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

/**
 * @author: yangdd@zparkhr.com.cn <br/>
 *          时间：2017年8月25日 下午12:34:27 TODO: FTP工具类的使用。
 */
public class FTPUtils {
	private static final Properties props = new Properties();
	/*
	 * 初始化配置文件
	 */
	static {
		
		InputStream is = null;
		try {
			is = FTPUtils.class.getResourceAsStream("/com/baizhi/util/ftpserver.properties");
			props.load(is);
		} catch (Exception e) {
			throw new RuntimeException("初始化配置文件异常", e);
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	/**
	 * 登陆FTP服务器，并切换到对应目录
	 * @return
	 */
	public static FTPClient ftpLogin() {
		FTPClient ftp = null;
		try {
			// 1. 创建FTP客户端工具对象。
			ftp = new FTPClient();
			// 2. ftp客户端连接远程FTP服务器，url代表FTP服务器的ip地址，port代表ftp端口号，默认是21。
			ftp.connect(props.getProperty("url"), Integer.parseInt(props.getProperty("port")));
			// 3. 登陆FTP服务器，username和password分别是FTP服务器(CentOS系统)的用户名和密码。
			ftp.login(props.getProperty("username"), props.getProperty("password"));
			// 4. 获得当前客户端对于FTP服务器的状态吗
			int replyCode = ftp.getReplyCode();
			// 5. 判断当前的状态吗是否可以使用FTP服务器。[官方文档上要求写上]
			if (!FTPReply.isPositiveCompletion(replyCode)) {
				ftp.disconnect();
				System.out.println("FTP服务器不可用异常");
			}
		} catch (NumberFormatException e) {
			throw new RuntimeException("数字转化异常!", e);
		} catch (SocketException e) {
			throw new RuntimeException("ftp服务器连接异常！", e);
		} catch (IOException e) {
			throw new RuntimeException("ftp文件传输异常！", e);
		}
		return ftp;
	}
	/**
	 * FTP文件上传。
	 * 
	 * @param filename
	 * @param sourceFileStream
	 */
	public static void ftpUploadFile(FTPClient ftp, String remoteFilename, InputStream sourceFileStream) {
		try {
			// 6. 设置缓冲大小为1M,不设置默认为8192 byte
			ftp.setBufferSize(Integer.parseInt(props.getProperty("buffersize")));
			// 7. 设置文件类型为二进制文件
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			// 8. 切换当前操作的目录
			ftp.changeWorkingDirectory(props.getProperty("ftpdir"));
			// 10. 将in输入流中的文件保存在FTP服务器的切换后的目录中，并且文件名为filename。
			ftp.storeFile(remoteFilename, sourceFileStream);
		} catch (IOException e) {
			throw new RuntimeException("ftp文件传输异常！", e);
		} finally {
			if (sourceFileStream != null) {
				try {
					sourceFileStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	
	/**
	 * 如果要上传多个资源，需要全部上传后再关闭ftp连接。所以将关闭ftp客户端和文件上传方法分开。
	 * 
	 * @param ftp
	 */
	public static void commit(FTPClient ftp) {
		try {
			if (ftp != null && ftp.isConnected()) {
				ftp.logout();
				ftp.disconnect();
			}
		} catch (IOException e) {
			throw new RuntimeException("ftp退出异常", e);
		}
	}
}
